﻿using System;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using StackExchange.Redis;
using Up6.core.Configs;

namespace Up6.core.Cache;

/// <summary>
/// 缓存redis实现
/// </summary>
public sealed class RedisCacheContext : ICacheContext
{
    private ConnectionMultiplexer _conn { get; set; }
    private IDatabase iDatabase { get; set; }

    public RedisCacheContext(IOptions<AppSetting> options)
    {
        _conn = ConnectionMultiplexer.Connect(options.Value.RedisConf);
        iDatabase = _conn.GetDatabase();
    }

    public override T Get<T>(string key)
    {
        RedisValue value = iDatabase.StringGet(key);
        if (!value.HasValue)
        {
            return default(T);
        }

        if (typeof(T) == typeof(string))
        {
            return (T)Convert.ChangeType(value, typeof(T));
        }
        else
        {
            return JsonConvert.DeserializeObject<T>(value);
           
        }
    }

    public override bool Set<T>(string key, T t, DateTime expire)
    {
        if (typeof(T) == typeof(string))
        {
            return iDatabase.StringSet(key, t.ToString(), expire - DateTime.Now);
        }
        else
        {
            return iDatabase.StringSet(key, JsonConvert.SerializeObject(t), expire - DateTime.Now);
        }
    }

    public override bool Remove(string key)
    {
        return iDatabase.KeyDelete(key);
    }

    public override bool Exist(string key)
    {
        return iDatabase.KeyExists(key);
    }
}